package com.line.myprojectservice.utils;


import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import static com.line.myprojectservice.constant.Constants.TIME_SEVEN_DAYS;

/**
 * @author ：Line
 * @date ： 2022/4/1 11:29
 * @description :TODO
 * 静态属性不能直接注⼊，可以通过其set⽅法进⾏注⼊。（注意⽣成的set⽅法需要去掉static）
 * 接着需要将该⼯具类作为⼀个spring管理的bean，这个必须，不然⽆法注⼊成功。
 * 只需要在该⼯具类上添加注解 @Component
 */
@Slf4j
@Component
public class RedisUtil {

    private static RedisTemplate<String, Object> redisTemplate;

    @Resource
    public void setRedisTemplate(RedisTemplate redisTemplate) {
        RedisUtil.redisTemplate = redisTemplate;
    }

    /**
     * 普通缓存放入
     */
    public static String getString(String key) {
        log.info("从Redis中查询{}的值", key);
        return (String) redisTemplate.opsForValue().get(key);
    }

    /**
     * 普通缓存放入
     *
     * @param key        键
     * @param value      值
     * @param expireTime 超时时间(秒)
     * @return true成功 false失败
     */
    public static Boolean setStrings(String key, String value, int expireTime) {
        try {
            redisTemplate.opsForValue().set(key, value, expireTime, TimeUnit.SECONDS);
            log.info("往Redis中放入{}的值", key);
            return true;
        } catch (Exception e) {
            log.info("redis放入失败");
            return false;
        }
    }

    /*默认七天*/
    public static Boolean setStrings(String key, String value) {
        return setStrings(key, value, TIME_SEVEN_DAYS);
    }


    /**
     * 删除key
     */
    public static void delete(String key) {
        redisTemplate.delete(key);
    }


    /**
     * 添加元素,有序集合是按照元素的score值由小到大排列
     */
    public static Boolean zAdd(String key, String value, double score) {
        return redisTemplate.opsForZSet().add(key, value, score);
    }

    /**
     * 是否存在key
     *
     * @param key
     * @return
     */
    public static Boolean hasKey(String key) {
        return redisTemplate.hasKey(key);
    }


    /**
     * 增加元素的score值，并返回增加后的值
     */
    public static Double zIncrementScore(String key, String value, double delta) {
        return redisTemplate.opsForZSet().incrementScore(key, value, delta);
    }

    /**
     * 获取集合的元素, 从大到小排序
     * @return
     */
    public static Set<Object> zReverseRange(String key, long start, long end) {
        return redisTemplate.opsForZSet().reverseRange(key, start, end);
    }

}
